package com.zztest.aitestmini.service.impl;

import com.zztest.aitestmini.common.TokenDb;
import com.zztest.aitestmini.common.UserBaseStr;
import com.zztest.aitestmini.common.ZzToken;
import com.zztest.aitestmini.dao.ZzTestUserMapper;
import com.zztest.aitestmini.dto.ResultDto;
import com.zztest.aitestmini.dto.TokenDto;
import com.zztest.aitestmini.dto.user.UserDto;
import com.zztest.aitestmini.entity.ZzTestUser;
import com.zztest.aitestmini.service.TestUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @Author: zhangcheng
 * @Description:
 * @Date: 2021/3/23/023 17:44
 * @Version: 1.0
 */

@Service
public class TestUserServiceImpl implements TestUserService {
    @Autowired
    private ZzTestUserMapper zzTestUserMapper;
    @Autowired
    private TokenDb tokenDb;

    /**
     * user注册方法
     * @param zzTestUser
     * @return
     */
    @Override
    public ResultDto<ZzTestUser> save(ZzTestUser zzTestUser) {
        //校验用户名 是否存在
        String userName = zzTestUser.getUserName();
        ZzTestUser queryzzTestUser = new ZzTestUser();
        queryzzTestUser.setUserName(userName);
        List<ZzTestUser> zzTestUserList = zzTestUserMapper.select(queryzzTestUser);
        System.out.println("入参");
        if (Objects.nonNull(zzTestUserList)&&zzTestUserList.size()>0){
            return ResultDto.fail("用户名已存在");
        }
        //2 盐值加密 密码加密
        String password =zzTestUser.getPassword();
        String newPassword = DigestUtils.md5DigestAsHex((UserBaseStr.md5Hex_sign + userName + password).getBytes());
        zzTestUser.setPassword(newPassword);
        zzTestUser.setCreateTime(new Date());
        zzTestUser.setUpdateTime(new Date());
        zzTestUserMapper.insertUseGeneratedKeys(zzTestUser);
        return ResultDto.success("成功",zzTestUser);
    }

    /**
     *
     * @param userDto 登录方法
     * @return
     */
    @Override
    public ResultDto<ZzToken> login(UserDto userDto) {
        String userName = userDto.getUserName();
        String password = userDto.getPassword();
        //1获取用户名密码 使用md5 加密
        String newPassword = DigestUtils
                .md5DigestAsHex((UserBaseStr.md5Hex_sign + userName + password).getBytes());
        //2查询数据库 是否存在
        ZzTestUser queryzzTestUser = new ZzTestUser();
        queryzzTestUser.setUserName(userDto.getUserName());
        queryzzTestUser.setPassword(newPassword);
        //数据库查询
        ZzTestUser resultTestUser = zzTestUserMapper.selectOne(queryzzTestUser);
        if (Objects.isNull(resultTestUser)){
            return  ResultDto.fail("用户名错误或密码不存在");
        }
        //生成的token对象
        String tokenstr = DigestUtils.md5DigestAsHex((System.currentTimeMillis() + userName + password).getBytes());
        //3 新建token对象 生成token
        ZzToken zzToken = new ZzToken();
        //放入token对象
        zzToken.setToken(tokenstr);
        //放入tokendto
        TokenDto tokenDto = new TokenDto();
        tokenDto.setToken(tokenstr);
        tokenDto.setUserName(resultTestUser.getUserName());
        tokenDto.setUserId(resultTestUser.getId());
        tokenDto.setDefaultJenkinsId(resultTestUser.getDefaultJenkinsId());

        tokenDb.addUserInfo(tokenstr,tokenDto);
        // 返回token给前端
          return  ResultDto.success("成功",zzToken);
    }



    @Override
    public ResultDto<ZzTestUser> update(ZzTestUser zzTestUser) {
        zzTestUser.setCreateTime(new Date());
        zzTestUser.setUpdateTime(new Date());
        // 原始方式 过于繁琐
      //  zzTestUserMapper.updateUserDemo(zzTestUser.getUserName(), zzTestUser.getPassword(),zzTestUser.getEmail(),zzTestUser.getId());
        zzTestUserMapper.updateByPrimaryKeySelective(zzTestUser);
        return ResultDto.success("成功",zzTestUser);
    }

    /**
     *  根据用户id删除
     * @param userId
     * @return
     */
    @Override
    public ResultDto delete(Integer userId) {
        ZzTestUser testUser = new ZzTestUser();
        testUser.setId(userId);
        // 删除方法
        zzTestUserMapper.deleteByPrimaryKey(userId);
        return ResultDto.success("成功");
    }

    /** 根据用户id或名称查询
     * @param zzTestUser
     * @return
     */
    @Override
    public ResultDto<List<ZzTestUser>> getByName(ZzTestUser zzTestUser) {
        //List<ZzTestUser> zzTestUsers = zzTestUserMapper.getByName(zzTestUser.getUserName(), zzTestUser.getId());
        List<ZzTestUser> zzTestUserList = zzTestUserMapper.select(zzTestUser);
        return  ResultDto.success("成功",zzTestUserList);
    }

}
